package main

import (
	"log"
	"net"
	"sync"

	"github.com/goburrow/serial"
)

// 将全局变量定义移到包级别
var (
    connections = make(map[net.Conn]bool)
    connMutex   sync.Mutex
)

func main() {
	var wg sync.WaitGroup
	wg.Add(2)

	// 串口配置
	serialConfig := &serial.Config{
		Address:  "/dev/rs485-3", // 串口名称，根据实际情况修改
		BaudRate: 4800,           // 波特率
		DataBits: 8,              // 数据位
		Parity:   "N",            // 校验位
		StopBits: 1,              // 停止位
		Timeout:  1000,           // 超时(毫秒)
	}

	// TCP服务器配置
	tcpAddr := ":8080" // 监听端口

	// 打开串口
	port, err := serial.Open(serialConfig)
	if err != nil {
		log.Fatalf("打开串口失败: %v", err)
	}
	defer port.Close()

	// 启动TCP服务器
	listener, err := net.Listen("tcp", tcpAddr)
	if err != nil {
		log.Fatalf("启动TCP服务器失败: %v", err)
	}
	defer listener.Close()
	log.Printf("TCP服务器已启动，监听端口 %s", tcpAddr)

	// 全局变量保存所有TCP连接
	var connections = make(map[net.Conn]bool)
	var connMutex sync.Mutex

	// 串口到TCP的转发
	go func() {
		defer wg.Done()
		buf := make([]byte, 128)
		for {
			n, err := port.Read(buf)
			if err != nil {
				log.Printf("串口读取错误: %v", err)
				continue
			}

			if n > 0 {
				data := buf[:n]
				log.Printf("从串口接收到数据: % X", data)

				// 转发给所有TCP客户端
				connMutex.Lock()
				for conn := range connections {
					_, err := conn.Write(data)
					if err != nil {
						log.Printf("TCP发送错误: %v", err)
						conn.Close()
						delete(connections, conn)
					}
				}
				connMutex.Unlock()
			}
		}
	}()

	// TCP到串口的转发
	go func() {
		defer wg.Done()
		for {
			conn, err := listener.Accept()
			if err != nil {
				log.Printf("TCP连接错误: %v", err)
				continue
			}
			log.Printf("新的TCP连接: %s", conn.RemoteAddr())

			// 将新连接加入全局map
			connMutex.Lock()
			connections[conn] = true
			connMutex.Unlock()

			go handleTCPConnection(conn, port)
		}
	}()

	wg.Wait()
}

// 修改handleTCPConnection函数，在连接关闭时从map中移除
// handleTCPConnection函数现在可以直接访问包级别的connMutex和connections
func handleTCPConnection(conn net.Conn, port serial.Port) {
    defer func() {
        connMutex.Lock()
        delete(connections, conn)
        connMutex.Unlock()
        conn.Close()
    }()
    
    buf := make([]byte, 128)
    for {
        n, err := conn.Read(buf)
        if err != nil {
            log.Printf("TCP读取错误: %v", err)
            return
        }

        if n > 0 {
            data := buf[:n]
            log.Printf("从TCP接收到数据: % X", data)
            _, err := port.Write(data)
            if err != nil {
                log.Printf("串口写入错误: %v", err)
                return
            }
        }
    }
}
